package pers.xiaojun.boot.mybatis.core.convert;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import pers.xiaojun.boot.common.pojo.PageParam;
import pers.xiaojun.boot.common.pojo.PageResult;
import pers.xiaojun.boot.common.util.BeanUtils;

/**
 * MyBatis Page转换
 *
 * @author xiaojun
 * @since 2025-10-28
 */
@Mapper
public interface PageConvert {

    PageConvert INSTANCE = Mappers.getMapper(PageConvert.class);

    /**
     * 转换 pageParam -> Page
     *
     * @param pageParam 分页查询参数
     * @param <T>       元素类型
     * @return Page
     */
    default <T> Page<T> toPage(PageParam pageParam) {
        Page<T> page = new Page<>();
        page.setCurrent(pageParam.getPageNo());
        page.setSize(pageParam.getPageSize());
        return page;
    }

    default <T> PageResult<T> toPageResult(Page<T> page) {
        PageResult<T> pageResult = new PageResult<>();
        pageResult.setList(page.getRecords());
        pageResult.setTotal(page.getTotal());
        return pageResult;
    }

    /**
     * 转换 Page -> PageResult，并转换元素类型
     *
     * @param page  MyBatis分页
     * @param clazz 目标元素类型
     * @param <S>   源数据类型
     * @param <T>   目标数据类型
     * @return {@link PageResult}
     */
    default <S, T> PageResult<T> toPageResult(Page<S> page, Class<T> clazz) {
        PageResult<T> pageResult = new PageResult<>();
        pageResult.setList(BeanUtils.toBeans(page.getRecords(), clazz));
        pageResult.setTotal(page.getTotal());
        return pageResult;
    }

}
